// Functions (函数) 示例
// 演示 Pascal 中函数的各种用法
program p_11_functions;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的系统函数

// 1. 简单函数 - 计算两个整数的和
function Add(a, b: Integer): Integer;
begin
  Add := a + b;
end;

// 2. 带有多个参数的函数 - 计算三个数的平均值
function Average(a, b, c: Real): Real;
begin
  Average := (a + b + c) / 3;
end;

// 3. 递归函数 - 计算阶乘
function Factorial(n: Integer): Int64;
begin
  if n <= 1 then
    Factorial := 1
  else
    Factorial := n * Factorial(n - 1);
end;

// 4. 函数返回布尔值 - 判断一个数是否为偶数
function IsEven(n: Integer): Boolean;
begin
  IsEven := (n mod 2 = 0);
end;

// 5. 函数处理字符串 - 连接两个字符串
function ConcatStrings(s1, s2: String): String;
begin
  ConcatStrings := s1 + s2;
end;

// 6. 函数与数组 - 计算整数数组的和
function SumArray(arr: array of Integer; size: Integer): Integer;
var
  i, sum: Integer;
begin
  sum := 0;
  for i := 0 to size - 1 do
    sum := sum + arr[i];
  SumArray := sum;
end;

// 7. 函数计算几何 - 计算圆的面积
function CircleArea(radius: Real): Real;
const
  PI = 3.14159;
begin
  CircleArea := PI * radius * radius;
end;

// 所有变量声明移到这里
var
  result: Integer;
  avg: Real;
  i: Integer;
  num: Integer;
  strResult: String;
  numbers: array[0..4] of Integer;
  arrSum: Integer;
  radius: Real;

// 程序主入口
begin
  WriteLn('=== Pascal 函数示例 ===');
  WriteLn;
  
  // 1. 调用简单函数
  WriteLn('1. 简单函数调用:');
  result := Add(15, 25);
  WriteLn('  Add(15, 25) = ', result);
  
  WriteLn;
  
  // 2. 调用带多个参数的函数
  WriteLn('2. 多参数函数调用:');
  avg := Average(10.5, 20.3, 30.2);
  WriteLn('  Average(10.5, 20.3, 30.2) = ', avg:0:2);
  
  WriteLn;
  
  // 3. 递归函数调用
  WriteLn('3. 递归函数调用:');
  for i := 0 to 10 do
  begin
    if i <= 5 then  // 只计算到5的阶乘，避免结果过大
      WriteLn('  ', i, '! = ', Factorial(i));
  end;
  
  WriteLn;
  
  // 4. 布尔函数调用
  WriteLn('4. 布尔函数调用:');
  num := 42;
  WriteLn('  数字 ', num, ' 是偶数: ', IsEven(num));
  
  num := 37;
  WriteLn('  数字 ', num, ' 是偶数: ', IsEven(num));
  
  WriteLn;
  
  // 5. 字符串函数调用
  WriteLn('5. 字符串函数调用:');
  strResult := ConcatStrings('Hello ', 'Pascal!');
  WriteLn('  ConcatStrings(''Hello '', ''Pascal!'') = ''', strResult, '''');
  
  WriteLn;
  
  // 6. 数组函数调用
  WriteLn('6. 数组函数调用:');
  numbers[0] := 10;
  numbers[1] := 20;
  numbers[2] := 30;
  numbers[3] := 40;
  numbers[4] := 50;
  arrSum := SumArray(numbers, 5);
  Write('  数组元素: ');
  for i := 0 to 4 do
    Write(numbers[i], ' ');
  WriteLn;
  WriteLn('  数组元素之和: ', arrSum);
  
  WriteLn;
  
  // 7. 几何函数调用
  WriteLn('7. 几何函数调用:');
  radius := 5.0;
  WriteLn('  半径为 ', radius:0:1, ' 的圆面积: ', CircleArea(radius):0:2);
  
  WriteLn;
  WriteLn('演示了 Pascal 中函数的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.